﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Net;
using System.Web;
using System.Web.Mvc;
using blacksoft.Models;
using blacksoft.Constantes;

namespace blacksoft.Controllers
{
    public class ProveedorController : Controller
    {
        private inf245travelbusEntities db = new inf245travelbusEntities();

        // GET: /Proveedor/
        public ActionResult Index()
        {
            var persona = db.Persona.Include(p => p.Terminal).Include(p => p.UnidadVenta);
            //filtro por tipo de persona
            persona = persona.Where(s => s.TipoPersona==1);
            //filtro solo activos
            persona = persona.Where(s => s.Estado.Contains("AC"));
            return View(persona.ToList());
        }

        // GET: /Proveedor/Details/5
        public ActionResult Details(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            Persona persona = db.Persona.Find(id);
            if (persona == null)
            {
                return HttpNotFound();
            }
            var producto_x_proveedor = db.Producto_x_Proveedor.Include(p => p.Persona).Include(p => p.Producto);
            ViewBag.ProveedorProductosList = producto_x_proveedor.ToList();
            return View(persona);
        }

        // GET: /Proveedor/Create
        public ActionResult Create()
        {
            //ORIGINAL ViewBag.IDTerminal = new SelectList(db.Terminal, "IDTerminal", "Nombre");
            ViewBag.IDTerminal = new SelectList(db.Terminal, "IDTerminal", "Nombre");
            ViewBag.IDUnidadVenta = new SelectList(db.UnidadVenta, "IDUnidadVenta", "Nombre");
            return View();
        }

        // POST: /Proveedor/Create
        // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
        // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
        [HttpPost]
        [ValidateAntiForgeryToken]
        //public ActionResult Create([Bind(Include="IDPersona,Nombre,ApellidoPaterno,ApellidoMaterno,DNI,FechaNacimiento,RazonSocial,RUC,Direccion,Telefono,TipoPersona,CargoPersonal,PuntosAcumulados,FechaRegistro,Estado,IDTerminal,Email")] Persona persona)
        public ActionResult Create([Bind(Include = "IDPersona,RazonSocial,RUC,Direccion,Telefono,Estado,Email")] ART_Proveedor proveedor)
        {
            //Revisamos si ese proveedor ya fue agregado, mediante su RUC
            bool repite = false;
            var dbProveedores = db.Persona.Include(p => p.Terminal).Include(p => p.UnidadVenta);
            dbProveedores = dbProveedores.Where(p => p.TipoPersona == 1);
            List<Persona> proveedoresList = dbProveedores.ToList();
            for (int i = 0; i < proveedoresList.Count(); i++)
                if (proveedor.RUC == proveedoresList[i].RUC) repite = true;
            
            if (ModelState.IsValid)
            {
                if (!repite)
                {
                    Persona persona = new Persona();
                    persona.RazonSocial = proveedor.RazonSocial;
                    persona.RUC = proveedor.RUC;
                    persona.Direccion = proveedor.Direccion;
                    persona.Telefono = proveedor.Telefono;
                    persona.Estado = proveedor.Estado;
                    //Por defecto las personas creadas son tipo Proveedor
                    persona.TipoPersona = 1; // Proveedor -> 1
                    //El sistema incluye automaticamente
                    persona.FechaRegistro = DateTime.Now;
                    db.Persona.Add(persona);
                    db.SaveChanges();
                    return RedirectToAction("Index");
                }
                else
                {
                    TempData["MODCOMP_failure_create_ruc"] = "Proveedor ya registrado";
                }
            }
            else
            {
                TempData["MODCOMP_failure_proveed_create_failure_empty"] = "Indique un RUC valido";
            }
            //ViewBag.IDTerminal = new SelectList(db.Terminal, "IDTerminal", "Nombre", persona.IDTerminal);
            //ViewBag.IDUnidadVenta = new SelectList(db.UnidadVenta, "IDUnidadVenta", "Nombre", persona.IDUnidadVenta);
            Persona tmpPersona = new Persona();
            return View(tmpPersona);
        }

        // GET: /Proveedor/Edit/5
        public ActionResult Edit(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            Persona persona = db.Persona.Find(id);
            if (persona == null)
            {
                return HttpNotFound();
            }
            ViewBag.IDTerminal = new SelectList(db.Terminal, "IDTerminal", "Nombre", persona.IDTerminal);
            ViewBag.IDUnidadVenta = new SelectList(db.UnidadVenta, "IDUnidadVenta", "Nombre", persona.IDUnidadVenta);
            return View(persona);
        }

        // POST: /Proveedor/Edit/5
        // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
        // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Edit([Bind(Include="IDPersona,Nombre,ApellidoPaterno,ApellidoMaterno,DNI,FechaNacimiento,RazonSocial,RUC,Direccion,Telefono,TipoPersona,CargoPersonal,PuntosAcumulados,FechaRegistro,Estado,IDTerminal,Email")] Persona persona)
        {
            ///* ------------------------------- SEGURIDAD --------------------------------------------- */
            // **** SEGURIDAD DE ACCESO ****
            ActionResult result_seguridad = ValidarSeguridad();
            if (result_seguridad != null)
            {
                return result_seguridad;
            }
            ///* ------------------------------ END SEGURIDAD ------------------------------------------ */

            // ****  GET ID Terminal    ****
            bool global = PerfilsController.TienePermiso((int)Session["Permisos"], PerfilsController.GLOBAL);
            int idTerminal = (int)Session["IDTerminal"];
            // ------              --------
            persona.IDTerminal = idTerminal;
            persona.TipoPersona = 1;
            persona.Estado = "AC";
            if (ModelState.IsValid)
            {
                db.Entry(persona).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            ViewBag.IDTerminal = new SelectList(db.Terminal, "IDTerminal", "Nombre", persona.IDTerminal);
            ViewBag.IDUnidadVenta = new SelectList(db.UnidadVenta, "IDUnidadVenta", "Nombre", persona.IDUnidadVenta);
            return View(persona);
        }

        // GET: /Proveedor/Delete/5
        public ActionResult Delete(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            Persona persona = db.Persona.Find(id);
            if (persona == null)
            {
                return HttpNotFound();
            }
            return View(persona);
        }

        // POST: /Proveedor/Delete/5
        [HttpPost, ActionName("Delete")]
        [ValidateAntiForgeryToken]
        public ActionResult DeleteConfirmed(int id)
        {
            Persona persona = db.Persona.Find(id);
            //db.Persona.Remove(persona);
            persona.Estado = "IN";
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                db.Dispose();
            }
            base.Dispose(disposing);
        }

        public PartialViewResult showInfoProveedor(string ruc)
        {
            Persona proveedor;
            proveedor = SunatController.getInfobyRUC(ruc);
            if (proveedor == null)
            {
                proveedor = new Persona();
            }
            return PartialView("_ProveedorDetails", proveedor);
        }
        private ActionResult ValidarSeguridad()
        {

            if (Session["Permisos"] == null)
            {
                TempData["LogueatePrimero"] = SystemField.NO_LOGUEADO;
                return RedirectToAction("Index", "ValidarLogin");
            }
            //ESTOY LOGUEADO PERO NO TENGO PERMISO PARA REALIZAR ESTA ACCION
            if (!PerfilsController.TienePermiso((int)Session["Permisos"], PerfilsController.COMPRAS))
            {
                TempData["SinPermiso"] = SystemField.SIN_PERMISO;
                return RedirectToAction("Index", "MainPageEmployes");
            }
            return null;
        }
    }
}
